/** ***********************************************************************************
* @file         dist_task.c
* @brief        AGNSS数据基础管理任务
* @details      主要用来辅助GNSS完成经纬度距离换算的任务；
* @author       杨小珛
* @date         2021/06/07
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#include <math.h>
#include <string.h>
#include <stdlib.h>

#include "dist_task.h"
#include "mon_task.h"
#include "log_task.h"
#include "gnss_task.h"

#define DIST_MAN_NAME   "DIST_MAN_TASK"

GaozQueueHandle_t dist_data_queue;           /*定义DIST数据消息队列*/
GaozSemaphoreHandle_t dist_data_semaphore; 

static uint32_t dist_calc_results;           /*计算两点间的距离*/  

static void dist_data_handle_task( void * pvParameters );
static void dist_data_queue_create(void);

/** ****************************************************************************
* @remarks       void dist_data_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         创建DIST基层数据管理任务
* @param[in]     uxPriority任务优先级；
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
void dist_data_create_task( unsigned portBASE_TYPE uxPriority )
{  
    dist_calc_results = 0;
    dist_data_queue_create();
    dist_data_semaphore = gaoz_sem_new(0);
    if( dist_data_semaphore == 0 )
    {
        while( 1 ); /*创建失败*/
    }
    gaoz_thread_create(dist_data_handle_task, DIST_MAN_NAME, 1024*4, NULL, uxPriority);
}

/** ****************************************************************************
* @remarks       static void gnss_recv_data_queue_create(void)
* @brief         创建发送数据消息队列
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
static void dist_data_queue_create(void)
{
    /* 创建模块网络发送数据的消息队列 */
    dist_data_queue = gaoz_queue_create( DIST_DATA_QUEUE_DEPTH, sizeof( uint32_t ) );
    if( dist_data_queue == 0 )
    {
        while( 1 ); /*创建失败,进行处理*/
    }
}

/** ****************************************************************************
* @remarks       uint32_t dist_data_queue_get( uint32_t *mode , uint32_t time_out )
* @brief         获取DIST数据发送消息队列数据
* @param[in]     *dist_msg 获取的数据地址
* @param[out]    无
* @return        pdPASS 接收到数据 pdFAIL 未接收到数据
* @attention     必须在任务中运行
*******************************************************************************/
static uint32_t dist_data_queue_get( uint32_t *mode , uint32_t time_out )
{
    if( dist_data_queue == 0 )
    {
        dist_data_queue_create();
    }
    if( gaoz_queue_get( dist_data_queue, mode, time_out )  == 0 ) //等待回应信号量
    {
        return pdPASS;
    }
    else
    {
        return pdFAIL;
    }
    return pdFAIL;
}

/** ****************************************************************************
* @remarks       uint32_t dist_data_queue_put( uint32_t mode )
* @brief         发DIST数据发送消息队列数据
* @param[in]     
* @param[out]    无
* @return        计算的距离
* @attention     必须在任务中运行
*******************************************************************************/
uint32_t dist_data_queue_put( uint32_t mode , uint32_t time_out )
{
    uint32_t ret = 0;
    
    if(( dist_data_queue == 0 ) || ( dist_data_semaphore == 0 ))
    {
        return ret;
    }

    dist_calc_results = pdFAIL;
    if( gaoz_queue_put( dist_data_queue, ( void * )&mode , time_out ) == 0 )
    {
        if( gaoz_sem_try_wait( dist_data_semaphore, time_out ) == true ) 
        {
            ret = dist_calc_results;
        }
    }
    return ret;
}

/** ****************************************************************************
* @remarks       static void dist_data_handle_task( void * pvParameters )
* @brief         DIST基础数据处理任务
* @param[in]     * pvParameters 任务参数
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
static void dist_data_handle_task( void * pvParameters )
{
    ( void ) pvParameters;
    uint32_t mode_infor = 0;
    mon_reg_task_dog( 60 * GAOZ_TICK_PERIOD_S ,(uint8_t *)DIST_MAN_NAME , TASK_SEM_YES );            /*注册任务看门狗*/
    log_debug_send( DEBUG_MODE,DIST_MAN_NAME ,"DIST management task started successfully\r\n",0 );
    for(;;)
    {   
        mon_reset_task_dog();
        if( dist_data_queue_get( &mode_infor , DIST_DATA_RUN_WAIT_TIME ) == pdPASS )
        {   
            if( mode_infor == LAT_LNG_DISTANCE )
            {
                //gnss_mileage_data_update();
                dist_calc_results = pdPASS;
                gaoz_sem_signal( dist_data_semaphore );              /*发送信号量，通知任务*/
            }
            else if( mode_infor == LAT_LNG_DENSITY )
            {   
                //if( gnss_static_filter_process() == pdPASS )
                //{
                    dist_calc_results = pdPASS;
                ///}
                gaoz_sem_signal( dist_data_semaphore );              /*发送信号量，通知任务*/
            }
        }
    }
}

